package net.cyue.nest.nestjava.core.injector;


import net.cyue.nest.nestjava.common.data.InjectableMetaType;
import net.cyue.nest.nestjava.common.data.MetaType;
import net.cyue.nest.nestjava.common.data.module.ControllerMeaType;
import net.cyue.nest.nestjava.common.data.module.ProviderMetaType;
import net.cyue.nest.nestjava.core.error.UnknownModuleException;

public class NestContainer
{
  private final ModuleContainer moduleContainer;

  public NestContainer() {
    this.moduleContainer = new ModuleContainer();
  }
  public ModuleContainer getModuleContainer() {
    return this.moduleContainer;
  }

  public ModuleData getModuleByID(MetaType metaType) {
    return this.moduleContainer.get(metaType);
  }
  public ModuleData addModule(MetaType moduleMetaType) {
    if (!this.moduleContainer.containsKey(moduleMetaType)) {
      ModuleData m = new ModuleData(moduleMetaType);
      this.moduleContainer.put(moduleMetaType, m);
      return m;
    }
    return this.moduleContainer.get(moduleMetaType);
  }

//  public void addImport(MetaType moduleMetaType, ModuleData importModuleData) {
//    if (!this.moduleContainer.containsKey(moduleMetaType)) {
//      throw new UnknownModuleException();
//    }
//    this.moduleContainer.get(moduleMetaType).addImport(importModuleData);
//  }

//  public void addExportedProvider(MetaType moduleMetaType, ProviderMetaData providerMetaData) {
//    if (!this.moduleContainer.containsKey(moduleMetaType)) {
//      throw new UnknownModuleException();
//    }
//    this.moduleContainer.get(moduleMetaType).addExportedProvider(providerMetaData);
//  }

  public void addInjectable(MetaType moduleMetaType, InjectableMetaType injectableMetaType) {
    if (!this.moduleContainer.containsKey(moduleMetaType)) {
      throw new UnknownModuleException();
    }
    this.moduleContainer.get(moduleMetaType).addInjectable(injectableMetaType);
  }

  public void addProvider(MetaType moduleMetaType, ProviderMetaType providerMetaType) {
    if (!this.moduleContainer.containsKey(moduleMetaType)) {
      throw new UnknownModuleException();
    }
    this.moduleContainer.get(moduleMetaType).addProvider(providerMetaType);
  }

  public void addController(MetaType moduleMetaType, ControllerMeaType controllerMeaType) {
    if (!this.moduleContainer.containsKey(moduleMetaType)) {
      throw new UnknownModuleException();
    }
    final ModuleData moduleDataInstance = this.moduleContainer.get(moduleMetaType);
    moduleDataInstance.addController(controllerMeaType);
  }


}

